Ce document prends comme paramètre la date du jour et la date du jour - 30 C’est une version de démo des fonctionnalités du package, et une exploration du code possible avant de faire le shiny
Les données seront chargées de 2023-01-03 à 2023-02-02
| code | tag | tagstation | libelle | unite | tablehisto | isac | pluvio |
|---|---|---|---|---|---|---|---|
| pontdecran | 1902 | 19 | Niveau Vilaine au Pont de Cran | m | B_PONT_DE_CRAN_NIVEAU | TRUE | FALSE |
| guenrouet | 2000 | 20 | Niveau Isac à Guenrouët | m | B_GUENROUET_NIVEAU | TRUE | FALSE |
| redon_ecluse | 2100 | 21 | Niveau Vilaine à l’écluse de Redon | m | B_REDONECLUSE_NIVEAU | FALSE | FALSE |
| vilaine_barrage | 2507 | 25 | Niveau Vilaine à Arzal | m | B_BARRAGE_NIVEAU | FALSE | FALSE |
| pluvio_isac_10min | 2532 | 3 | Pluvio Isac 10 min | mm | b_isac_pluvio | FALSE | TRUE |
| pluvio_isac_veille | 2533 | 3 | Pluvio Isac veille, pas toujours égales la somme des valeurs pluvio | mm | b_isac_pluvio | FALSE | FALSE |
| pluvio_barrage_10min | 2530 | 25 | Pluvio barrage 10 min | mm | b_barrage_pluvio | FALSE | TRUE |
| pluvio_barrage_veille | 2531 | 25 | Pluvio barrage, données à j-2 rapportées à 4:10 | mm | b_barrage_pluvio | FALSE | FALSE |
| isac_aval1 | 370 | 3 | Niveau Vilaine aval Prévert (1) | m | b_isac_mesure | TRUE | FALSE |
| isac_amont2 | 371 | 3 | Niveau Isac amont Prévert(2) | m | b_isac_mesure | TRUE | FALSE |
| isac_aval2 | 372 | 3 | Niveau Vilaine aval Prévert (2) | m | b_isac_mesure | FALSE | FALSE |
| isac_amont1 | 369 | 3 | Niveau Isac amont Prévert (1) | m | b_isac_mesure | FALSE | FALSE |
| isac_fonctionnement_cumul_p1 | 380 | 3 | Isac fonctionnement cumulé pompe 1 | h | b_isac_mesure | TRUE | FALSE |
| isac_fonctionnement_cumul_p3 | 381 | 3 | Isac fonctionnement cumulé pompe 2 | h | b_isac_mesure | TRUE | FALSE |
| isac_position_vanne_1 | 334 | 3 | Isac position vanne 1 | m | b_isac_mesure | TRUE | FALSE |
| isac_position_vanne_2 | 358 | 3 | Isac position vanne 2 | m | b_isac_mesure | TRUE | FALSE |
| isac_niveau_marais | 384 | 3 | Niveau Isac niveau marais (Le Clandre) | m | b_isac_niveaumarais | TRUE | FALSE |
Il faut aussi demander à Cédric ou Benjamin les valeurs à mettre pour la connexion et les passer à la main comme ci-dessous.
pool <- pool::dbPool(
drv = RMariaDB::MariaDB(),
dbname = "archive_IAV",
host = "demande à Cédric",
username = "demande à Cédric le nom en lecture",
password = "demande à Cédric le mot de passe hyper - secret",
port=3306
)
Ci dessous un script de chargement, toute la première partie peut être évitée en passant les arguments de connexion comme indiqué dans le code ci-dessus.
Dans le programme de chargement
tags = isac$tag[isac$isac] va chercher les données isac où
isac$isac correspond aux valeurs en bleu dans le tableau
des variables. Un choix peut être effectué en passant un vecteur de tag
par exemple
tag= c(1902, 2000, 369, 370, 371, 380, 381, 334, 358, 384)
va rajouter la variable du tag 369 aux valeurs par défaut, c’est à dire
la variable isac_amont_1.
if (params$work_with_db){
if (!exists("mainpass")) mainpass <- getPass::getPass(msg = "main password")
if (!exists("hostmysql")) {
hostmysql. <- getPass::getPass(msg = "Saisir host")
# ci dessous pour ne pas redemander au prochain tour
hostmysql <- encrypt_string(string = hostmysql., key = mainpass)
} else {
hostmysql. <- decrypt_string(string = hostmysql, key = mainpass)
}
if (!exists("pwdmysql")) {
pwdmysql. <- getPass::getPass(msg = "Saisir password")
pwdmysql <- encrypt_string(string = pwdmysql., key = mainpass)
} else {
# pass should be loaded
pwdmysql. <- decrypt_string(string = pwdmysql, key = mainpass)
}
if (!exists("umysql")) {
umysql. <- getPass::getPass(msg = "Saisir user")
umysql <- encrypt_string(string = umysql., key = mainpass)
} else {
umysql. <- decrypt_string(string = umysql, key = mainpass)
}
# attention il faut avaoir définit mainpass <- "xxxxx"
pool <- pool::dbPool(
drv = RMariaDB::MariaDB(),
dbname = "archive_IAV",
host = hostmysql.,
username = umysql.,
password = pwdmysql.,
port=3306
)
system.time(isac_dat <-
load_isac(
debut = as.POSIXct(
strptime(debut, format = "%Y-%m-%d")
),
fin = as.POSIXct(
strptime(fin, format = "%Y-%m-%d")
),
tags = isac$tag[isac$isac],
con = pool
))
pool::poolClose(pool)
} else {
# chargement du jeu de données du package
isac_dat <- SIVA::isac_dat
}# end if params$work_with_db
Graphique des niveaux sur l’Isac.
which_niveau <- grep("Niveau", attributes(isac_dat)$libelle)+1
isac_dat_niveau <- isac_dat %>%
dplyr::select(1,all_of(which_niveau))
rAmCharts::amTimeSeries(
isac_dat_niveau,
'horodate',
colnames(isac_dat_niveau)[2:ncol(isac_dat_niveau)],
bullet = "round",
color = randomcoloR::distinctColorPalette(ncol(isac_dat_niveau)-1),
#backgroundColor = "#40555E",
#backgroundAlpha = 0.4,
bulletSize = 4,
aggregation = "Average",
fillAlphas = 0.2,
groupToPeriods = c('10mm', '30mm', 'hh', 'DD', 'MAX'),
# c('hh', 'DD', '10DD','MM','MAX'),
linewidth = 0.2,
legend = TRUE
) %>%
rAmCharts::setExport(enabled = TRUE)
#> Warning in controlgroupToPeriods(groupToPeriods, difft): NAs introduits lors de
#> la conversion automatique
Ci dessous calcul du fonctionnement des pompes,les valeurs sont des
fonctionnement horaires rapportés toutes les dix minutes,
traitement_isac traite les valeur abérrantes et permet le calcul du
débit des pompes Les données de cumul ne sont dispo qu’après 2016, il
n’y a pas de relation entre le temps de fonctionnement et les coûts.
Voir ? traitement_isac. Dans la fonction
traitement_isac voir les arguments, cout_elec
en 2022 0.174 il s’agit du prix de l’electricité hors heures pleines et
heures creuses. Voir aussi cout_carbone. La source du code
est disponbile à voir aussi les sources : https://github.com/Eaux-et-Vilaine/SIVA/blob/main/R/traitement_isac.R
# traitement des données des pompes
isac_dat <- traitement_isac(isac_dat)
# Calcul du débit du vannage.
# noter les arguments hamont et haval qui peuvent être adaptés...
knitr::kable(head(isac_dat)) %>% kable_styling(bootstrap_options=c("hover","striped","condensed","responsive", "full_width"=FALSE))
| horodate | pontdecran | guenrouet | isac_amont2 | isac_fonctionnement_cumul_p1 | isac_fonctionnement_cumul_p3 | isac_position_vanne_1 | isac_position_vanne_2 | isac_niveau_marais | h | t | cout_euros | cout_carbone | Q_pompes |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2020-01-01 00:00:00 | 1.702 | 2.736 | 2.42 | NA | NA | 0.39 | 0.01 | NA | 0.718 | 0 | 0 | 0 | 0 |
| 2020-01-01 00:10:00 | 1.705 | 2.721 | 2.42 | 0 | 0 | 0.39 | 0.01 | NA | 0.715 | 0 | 0 | 0 | 0 |
| 2020-01-01 00:20:00 | 1.703 | 2.721 | 2.43 | 0 | 0 | 0.39 | 0.01 | NA | 0.727 | 0 | 0 | 0 | 0 |
| 2020-01-01 00:30:00 | 1.701 | 2.721 | 2.43 | 0 | 0 | 0.39 | 0.01 | NA | 0.729 | 0 | 0 | 0 | 0 |
| 2020-01-01 00:40:00 | 1.696 | 2.721 | 2.43 | 0 | 0 | 0.39 | 0.01 | NA | 0.734 | 0 | 0 | 0 | 0 |
| 2020-01-01 00:50:00 | 1.691 | 2.721 | 2.43 | 0 | 0 | 0.39 | 0.01 | NA | 0.739 | 0 | 0 | 0 | 0 |
Les débits des vannes dépendent de la largeur de chacune des vannes. Les vannes ne sont pas fixes. La formule de Manning est utilisée pour le vannage, il peut y avoir deux fonctionnements. Par exemple pour la vanne 1 qui est légerement moins large et au centre de l’ouvrage : on calcule : Le choix des sondes amont et aval a une grande importance pour le calcul de débit, si possible utiliser les sondes proches de l’ouvrage.
\[\Delta = h_{amont} - h_{aval} \\ \begin{cases} \Delta \geq 0 \implies Q = C_{ma} h_{vanne} l \sqrt(2 g \Delta) \\ \Delta < 0 \implies Q = -C_{ma} h_{vanne} l \sqrt(-2 g \Delta) \end{cases}\]
Avec :
Voir ? debit_vannes_isac pour plus de détails. voir
aussi les sources : https://github.com/Eaux-et-Vilaine/SIVA/blob/main/R/debit_vannes_isac.R
La fonction debit_vannes_isac calcule la continuité
piscicole au niveau de la vanne à l’aide de la différence de niveau
\(\Delta\) et de l’ouverture de la
vanne. Si la vanne est ouverte de moins de 5 cm la migration est
considérée comme impossible, au delà de 5 cm, le \(\Delta\) (en valeur absolue car il peut
être négatif) détermine si les conditions de migration. En dessous de 30
cm la migration est considérée comme bonne, entre 30 cm et 50 cm elle
est considérée comme difficile, au delà de 50 cm la migration est
impossible. Les valeurs sont “1-transparente”, “2-difficile”,
“3-bloquee” et “4-inf5cm”.
La fonction indicateur_avifaune_isac calcule les
conditions d’accueil de l’avifaune dans la période hivernale
Analyse de l’indicateur avifaune sur l’Isac
indicateur_avifaune_isac(
dat,
h_favorable = 2.4,
h_moyen = 2.2,
mois_debut = "11",
mois_fin = "4",
niveau_marais = "isac_niveau_marais"
)
Arguments
dat Un tableau de données, chargé par load_isac et traitement_debit_isac
h_favorable Le niveau favorable à l’accueil d’oiseaux hivernants sur l’Isac
h_moyen Le niveau en dessous duquel l’accueil des oiseaux hivernants devient mauvais
mois_debut
Le mois de début de l’accueil de l’avifaune (inclus)
mois_fin
Le mois de fin de l’accueil de l’avifaune (inclus)
niveau_marais
Le niveau dans les marais, defaut “isac_niveau_marais” voir le jeu de
données isac pour les codes possibles
Le programme retourne Ub vecteur (factor) des types pour l’avifaune
La fonction indicateur_brochet_isac calcule les
conditions d’accueil de l’avifaune dans la période hivernale
indicateur_brochet_isac(
dat,
h_favorable = 2.3,
h_moyen = 2.2,
debut_ponte = "25/02",
fin_ponte = "15/03",
fin_emergence = "01/05",
niveau_marais = "isac_niveau_marais"
)
Arguments :
dat Un tableau de données, chargé par load_isac et traitement_debit_isac.
h_favorable Le niveau favorable pour la reproduction.
h_moyen Hauteur en dessus de laquelle la reproduction est considérée comme moyenne et et en dessous duquel elle est considérée comme mauvaise.
debut_ponte Date de début de ponte defaut “25/02”
fin_ponte
Date de fin de ponte et début de l’émergence defaut “15/03”
fin_emergence
La date de fin de l’emergence (exclue) defaut “01/05”.
niveau_marais
Le niveau dans les marais, defaut “isac_niveau_marais” voir le jeu de
données isac pour les codes possibles.
La fonction retourne : Ub vecteur (factor) des types pour le brochet
note :si on est pas dans la bonne période, pas de calcul du niveau ponte, on prend 2.30 comme référence….)
#data(isac_dat)
# Calcul du débit et de la continuité au niveau de l'ouvrage
debit <- debit_vannes_isac(
hamont = isac_dat$isac_amont2,
haval = isac_dat$pontdecran,
hvanne1 = isac_dat$isac_position_vanne_1,
hvanne2 = isac_dat$isac_position_vanne_2
)
isac_dat1 <- cbind(isac_dat, debit)
# cacul des indicateurs avisfaune et brochet
# choisir niveau_marais = "isac_niveau_marais" si la variable est disponible
isac_dat1$avifaune <- indicateur_avifaune_isac(isac_dat1, niveau_marais="guenrouet")
#> Warning in indicateur_avifaune_isac(isac_dat1, niveau_marais = "guenrouet"):
#> Attention, 300 donnees manquantes sur 52588 pour guenrouet
isac_dat1$brochet <- indicateur_brochet_isac(isac_dat1, niveau_marais="guenrouet")
#> Warning in indicateur_brochet_isac(isac_dat1, niveau_marais = "guenrouet"):
#> Attention, 300 donnees manquantes sur 52588 pour guenrouet
# Graphique en ggplot, plusieurs graphiques, on notera l'usage de
#cowplot::plot_grid(... align = "v", axis = 'lr') pour aligner exactement
# plusieurs graphiques sur l'axe des x
# pour tout rassembler en un seul graphique utiliser ggnewscale::new_scale_fill()
g0 <- ggplot(isac_dat1) +
geom_line(aes(x=horodate, y= Q, colour="Q-vannes")) +
geom_line(aes(x=horodate, y = Q_pompes, colour="Q-pompes")) +
scale_colour_manual("Débit", values=c("Q-vannes"=bleu_EV,"Q-pompes"=orange_EV)) +
theme_bw()
g1 <- ggplot(isac_dat1) +
geom_rect(
aes(
xmin = horodate,
xmax = horodate + as.difftime(10, units = "mins"),
ymin = -30,
ymax = -35,
fill = mig
)) +
scale_fill_manual("Transparence migratoire", values = c("1-transparente"="blue",
"2-difficile"="orange",
"3-bloquee"="red",
"4-inf5cm"="purple"))+
theme_minimal() +
theme(axis.line.x = element_blank(), axis.line.y = element_blank(),
axis.text.x = element_blank(), axis.text.y = element_blank(),
axis.ticks.x = element_blank(), axis.ticks.y = element_blank(),
axis.title.x = element_blank(), axis.title.y = element_blank())+
theme(legend.position="bottom",
legend.title = element_text(size=6),
legend.text = element_text(size=6),
legend.key.height =unit(0.4, 'cm'),
legend.key.width =unit(0.4, 'cm'),
legend.direction = "horizontal",
panel.grid.major = element_blank(),
panel.grid.minor = element_blank())
g2 <- ggplot(isac_dat1) +
geom_rect(
aes(
xmin = horodate,
xmax = horodate + as.difftime(10, units = "mins"),
ymin = -40,
ymax = -45,
fill = avifaune
)) +
scale_fill_manual("Accueil avifaune", values = c("0-bon"="blue",
"1-moyen"="orange",
"2-mauvais"="red",
"3-hors periode"="black",
"4-inconnu"="grey"))+
theme_minimal() +
theme(axis.line.x = element_blank(), axis.line.y = element_blank(),
axis.text.x = element_blank(), axis.text.y = element_blank(),
axis.ticks.x = element_blank(), axis.ticks.y = element_blank(),
axis.title.x = element_blank(), axis.title.y = element_blank())+
theme(legend.position="bottom",
legend.title = element_text(size=6),
legend.text = element_text(size=6),
legend.key.height =unit(0.4, 'cm'),
legend.key.width =unit(0.4, 'cm'),
legend.direction = "horizontal",
panel.grid.major = element_blank(),
panel.grid.minor = element_blank())
g3 <- ggplot(isac_dat1) +
geom_rect(
aes(
xmin = horodate,
xmax = horodate + as.difftime(10, units = "mins"),
ymin = -50,
ymax = -55,
fill = brochet
)) +
scale_fill_manual("Repro brochet", values = c("0-repro-bon"="blue",
"1-repro-moyen"="orange",
"2-repro-mauvais"="red",
"3-emergence-bon"="cyan",
"4-emergence-moyen"="gold",
"5-emergence-mauvais"="firebrick",
"6-inconnu/hors periode"="black")) +
theme_minimal() +
theme(axis.line.x = element_blank(), axis.line.y = element_blank(),
axis.text.x = element_blank(), axis.text.y = element_blank(),
axis.ticks.x = element_blank(), axis.ticks.y = element_blank(),
axis.title.x = element_blank(), axis.title.y = element_blank())+
theme(legend.position="bottom",
legend.title = element_text(size=6),
legend.text = element_text(size=6),
legend.key.height =unit(0.4, 'cm'),
legend.key.width =unit(0.4, 'cm'),
legend.direction = "horizontal",
panel.grid.major = element_blank(),
panel.grid.minor = element_blank())
cowplot::plot_grid(g0, g1, g2, g3,
ncol = 1, nrow = 4, align = "v", axis = 'lr',
rel_heights = c(4,1,1,1.3))